#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

class String 
{
public:
	int *GetNum();
	String(char *pstr);
	~String();
	String(String &s);
	String&operator=(String &s);
	//String& operator+=(const String& s);
	friend ostream&operator<<(ostream &_cout,const String &s);

	size_t Size()const; 
	//size_t Lengh()const; 
	char& operator[](size_t index); 
	//const char& operator(size_t index); 
	bool operator>( String& s); 
	bool operator<( String& s); 
	bool operator==( String& s); 
	bool operator!=(String& s); 
	void Copy( String& s); 
	bool strstr( String& s); 
	String& operator+=( String& s); 
private:
	char *_pstr;
};

int* String::GetNum()
{
	return (int*)(_pstr - 4);
}


String::String(char *pstr = "")
{
	_pstr = new char[strlen(pstr)+1+4];
	_pstr += 4;
	*GetNum() = 0;
	strcpy(_pstr,pstr);
    ++*GetNum();
}

String::~String()
{
	if (_pstr && 0 == --*GetNum())
	{
		delete[] (_pstr-4);
		_pstr = NULL;
	}
}

String::String( String &s)
:_pstr(s._pstr)
{
	if (this != &s)
	{
		++*GetNum();
	}
}

String &String::operator=(String &s)
{
	if (this != &s)
	{
		if (_pstr && 0 == --*GetNum())
		{
			delete[] (_pstr-4);
		}
		_pstr = s._pstr;
		++*GetNum();
	}
	return *this;
}

ostream& operator<<(ostream &_cout,const String &s)
{
	_cout<<s._pstr;
	return _cout;
}


String& String::operator+=(const String& s)
{
	strcat(_pstr,s._pstr);
	return *this;
}


size_t String::Size()const
{
	return strlen(_pstr);
}

char& String::operator[](size_t index)
{
	return *(_pstr+index);
}

bool String::operator>( String& s)
{
	while (*_pstr&&*(s._pstr))
	{
		if (*_pstr > *s._pstr)
		{
			return true;
		}
		else if (*_pstr == *s._pstr)
		{
			_pstr++;
			s._pstr++;
		}
		else
			return false;
	}
	if (_pstr)
	{
		return true; 
	}
	else
		return false;
}
bool String::operator<( String& s)
{
	while (*_pstr&&*(s._pstr))
	{
		if (*_pstr < *s._pstr)
		{
			return true;
		}
		else if (*_pstr == *s._pstr)
		{
			_pstr++;
			s._pstr++;
		}
		else
			return false;
	}
	if (*s._pstr)
	{
		return true; 
	}
	else
		return false;
}
bool String::operator==( String& s)
{
	while (*_pstr&&*s._pstr)
	{
		if(*_pstr == *s._pstr)
		{
			_pstr++;
			s._pstr++;
		}
		else
		{
			return false;
		}
	}
	if (*_pstr == '\0'&&*s._pstr == '\0')
	{
		return true;
	}
	else
		return false;
}
bool String::operator!=(String& s)
{
	while (*_pstr&&*s._pstr)
	{
		if (*_pstr != *s._pstr)
		{
			return true;
		}
		else
		{
			_pstr++;
			s._pstr++;
		}
	}
	if (*_pstr == '\0'&&*s._pstr == '\0')
	{
		return false;
	}
	else
		return true;
}
void String::Copy( String& s)
{
	while (*_pstr&&*s._pstr)
	{
		*_pstr = *s._pstr;
		_pstr++;
		s._pstr++;
	}
	*_pstr = '\0';
}
bool String::strstr( String& s)
{
	char *dst = NULL;
	//char *remember_dst = _pstr;
	char *src = s._pstr;
	//char *remember_src = s._pstr;
	while (*_pstr && *s._pstr)
	{
		dst = _pstr;
		src = s._pstr;
		if (*dst == *src)
		{
			//dst = remember_dst;
			//src = remember_src;
			while (*dst&&*src)
			{
				if (*dst != *src)
					break;
				else
				{
					dst++;
					src++;
				}
			}
			if (src == NULL)
			{
				return true;
			}
		}
		_pstr++;
		s._pstr++;
	}
	return false;
}
//String& String::operator+=( String& s)
//{
//	String tmp(*this);
//	while (*_pstr++)
//		;
//	while (*_pstr++ = *s._pstr++)
//		;
//	*_pstr = '\0';
//	return tmp;
//}
int main()
{
	String s1("aaa");
	String s2(s1);
	String s3("hahah");
	s2 += s3;
	cout<<s2;
	//cout<<s3[2]<<endl;
	/*if (s3 < s1)
	{
		cout<<"OK"<<endl;
	}
	else
		cout<<"NO"<<endl;*/
	return 0;
}

